home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / clpnet.zip / CLIPSUBA.DOC < prev    next >
Text File  |  1992-10-27  |  40KB  |  692 lines

  1.                             ┌──────────────────────┐
  2.                             │       CLIPSUBA       │
  3.                             ├──────────────────────┤
  4.                             │ Assembly Subroutines │
  5.                             │      for Clipper     │
  6.                             │                      │
  7.                             │    By Dave Frailey   │
  8.                             └──────────────────────┘
  9.  
  10.  
  11. ───────────────────────────────────────────────────────────────────────────────
  12. CLIPSUBA (Clipper Subroutines in Assembler) is a collection of useful assembly
  13. language routines for use with clipper, mostly centered around Novell API calls.
  14.  
  15. To use them simply specify either CLIPSUBS.OBJ (for Summer '87) or CLIPSUB5.OBJ
  16. (for Clipper 5) as an additional object file for your linker to use (usually
  17. following the primary object file having your program's filename).
  18.  
  19. These routines are released to the public domain for non-commercial use only.
  20. The author retains exclusive rights to the source code, and may be contacted
  21. at 805/264-1700 for licensing information in commercial applications.
  22.  
  23.                               ┌───────────────────┐
  24.                               │     CLIPSUBA      │
  25.                               ├───────────────────┤
  26.                               │ PUBLIC PROCEDURES │
  27.                               └───────────────────┘
  28.  
  29.  
  30. PROCEDURE       CALLING CRITERIA
  31. ─────────────   ───────────────────────────────────────────────────────────────
  32. DCOMRES......   log=DCOMRES()
  33. DPRINT.......   void=DPRINT(Port,Text[,Length])
  34. DPRINTT......   int=DPRINTT(Port,Text,Length,Ticks)
  35. DCLRSPL......   void=DCLRSPL()
  36. DGSSIZE......   int*4=DGSSIZE()
  37. DGSIUSE......   int*4=DGSIUSE()
  38. DGSPORT......   int*2=DGSPORT()
  39. CPRNRDY......   log=CPRNRDY(Port)
  40. CMOUSE.......   log=CMOUSE(Parm1,Parm2,Parm3,Parm4)
  41. CMSEEMU......   log=CMSEEMU(HSens,VSens)
  42. CGRES1.......   int=CGRES1()
  43. CGRES2.......   int=CGRES2()
  44. CGRES3.......   int=CGRES3()
  45. CGRES4.......   int=CGRES4()
  46. CGCDIR.......   str=CGDIR([Drive])
  47. CGVDRVS......   str=CGVDRVS()
  48. CSETCSR......   void=CSETCSR(Start,End)
  49. MKDIR........   log=MKDIR(Path)
  50. RMDIR........   log=RMDIR(Path)
  51. SETPAL.......   void=SETPAL(List)
  52. CHEX.........   str=CHEX(Value)
  53. FTEMP........   int=FTEMP(Path)
  54. NFILCHK......   int=NFILCHK(Filespec)
  55. NUSRID.......   str=NUSRID()
  56. NUSRNAM......   str=NUSRNAM()
  57. NSNDMSG......   log=NSNDMSG(Name,Text)
  58. NGOCCNT......   int=NGOCCNT(ObjName,ObjType)
  59. NSVRNAM......   str=NSVRNAM()
  60. NATTACH......   log=NATTACH(Server)
  61. NDETACH......   log=NDETACH(Server)
  62. NPRISVR......   log=NPRISVR([Server])
  63. NPRESVR......   log=NPRESVR([Server])
  64. NLOGIN.......   log=NLOGIN(Name,Password,ObjType)
  65. NLOGOUT......   log=NLOGOUT([Server])
  66. NGOLIST......   int=NGOLIST(Name,Group,ObjType,ObjName[],IdText[],IdNumber[])
  67. NQATTCH......   log=NQATTCH(QueueID)
  68. NQDETCH......   log=NQDETCH(QueueID)
  69. NSVQJOB......   int=NSVQJOB(QueueID,[JobType])
  70. NFSQJOB......   log=NFSQJOB(QueueID,JobNumber)
  71. NASQJOB......   log=NASQJOB(QueueID,JobNumber)
  72. NCRIGTS......   log=NCRIGTS(QueueID,JobNumber)
  73. NRRIGTS......   log=NRRIGTS()
  74. NQJLIST......   int=NQJLIST(QueueID)
  75. NQGJLNO......   int=NQGJLNO(Index)
  76. NQGJSTS......   str=NQGJSTS(QueueID,JobNumber)
  77. NQGFSIZ......   int*4=NQGFSIZ(QueueID,JobNumber)
  78. NDTTIME......   str=NDTTIME()
  79. NSBCMDE......   void=NSBCMDE(mode)
  80. NGBCMSG......   str=NGBCMSG()
  81. NATTDIR......   log=NATTDIR(Object,Type,Rights,Directory)
  82.  
  83.                             ┌───────────────────────┐
  84.                             │       CLIPSUBA        │
  85.                             ├───────────────────────┤
  86.                             │    REFERENCE GUIDE    │
  87.                             └───────────────────────┘
  88.  
  89.  
  90. ┌─────────────────────────────────────────────────────────────────────────────┐
  91. │ log=DCOMRES()                                   {Check if dCOM is Resident} │
  92. └─────────────────────────────────────────────────────────────────────────────┘
  93.   ■  Returns a logical true if dCOM is resident in memory, otherwise false.
  94.  
  95. ┌─────────────────────────────────────────────────────────────────────────────┐
  96. │ void=DPRINT(Port,Text[,Length]                    {Print to dCOM's Spooler} │
  97. └─────────────────────────────────────────────────────────────────────────────┘
  98.   ■  Prints text to the specified port, directly addressing dCOM's Spooler
  99.      if resident.  If dCOM is not resident, DPRINT will handle printing.
  100.   ■  "Port" is an integer ranging from 0 to 2, corresponding to LPT1 to LPT3.
  101.   ■  "Text" is a variable length string to be printed.
  102.   ■  "Length" is an optional integer specifying the length of the text to
  103.      print.  If Length is not specified, DPRINT will print up to the first
  104.      null terminating character found.  Length should be used when the text
  105.      may have embedded nulls (ASCII 0) which are meant to be printed.
  106.  
  107. ┌─────────────────────────────────────────────────────────────────────────────┐
  108. │ int=DPRINTT(Port,Text,Length,Ticks)               {Print to dCOM's Spooler} │
  109. └─────────────────────────────────────────────────────────────────────────────┘
  110.   ■  Prints text to the specified port, directly addressing dCOM's Spooler
  111.      if resident.  If dCOM is not resident, DPRINTT will handle printing.
  112.   ■  If dCOM's spooler isn't used (either because its active on a different
  113.      port, or does not exist) DPRINTT will time-out after the number of timer-
  114.      ticks specified, returning the actual number of characters printed.
  115.   ■  "Port" is an integer ranging from 0 to 2, corresponding to LPT1 to LPT3.
  116.   ■  "Text" contains the string to be printed.
  117.   ■  "Length" is an integer specifying the total size of the text to print.
  118.   ■  "Ticks" is the number of timer ticks (1 tick = 1/18th of a second).
  119.  
  120. ┌─────────────────────────────────────────────────────────────────────────────┐
  121. │ void=DCLRSPL()                                 {Clear dCOM's Print Spooler} │
  122. └─────────────────────────────────────────────────────────────────────────────┘
  123.   ■  Clears dCOM's print spooler and begins flush period if dCOM is resident.
  124.  
  125. ┌─────────────────────────────────────────────────────────────────────────────┐
  126. │ int*4=DGSSIZE()                             {Get dCOM's Print Spooler Size} │
  127. └─────────────────────────────────────────────────────────────────────────────┘
  128.   ■  Returns a long integer of the total size of dCOM's print spooler in bytes.
  129.  
  130. ┌─────────────────────────────────────────────────────────────────────────────┐
  131. │ int*4=DGSIUSE()                            {Get dCOM's Spooler In Use Size} │
  132. └─────────────────────────────────────────────────────────────────────────────┘
  133.   ■  Returns a long integer of the space in use in dCOM's print spooler.
  134.  
  135. ┌─────────────────────────────────────────────────────────────────────────────┐
  136. │ int*2=DGSPORT()                            {Get dCOM's Spooler Port In Use} │
  137. └─────────────────────────────────────────────────────────────────────────────┘
  138.   ■  Returns an integer or 0 to 2 defining the active spooler port.
  139.   ■  If the spooler is not active, the last port accessed, or a value of FFFFh
  140.      if no port has yet been accessed, is returned.
  141.  
  142. ┌─────────────────────────────────────────────────────────────────────────────┐
  143. │ log=CPRNRDY([Port])                              {Get Printer Ready Status} │
  144. └─────────────────────────────────────────────────────────────────────────────┘
  145.   ■  Returns logical true if the specified printer port is on-line and ready
  146.      to receive a character.
  147.   ■  "Port" is an optional integer ranging from 0 to 2, corresponding to LPT1
  148.      to LPT3.  If Port is not specified, LPT1 will be assumed.
  149.  
  150. ┌─────────────────────────────────────────────────────────────────────────────┐
  151. │ log=CMOUSE(Parm1,Parm2,Parm3,Parm4)            {Mouse Driver Function Call} │
  152. └─────────────────────────────────────────────────────────────────────────────┘
  153.   ■  Allows access to the mouse driver at interrupt 33h.
  154.   ■  Returns a logical false if mouse driver is not present.
  155.   ■  "Parm1" through "Parm4" represent registers AX through DX respectively.
  156.   ■  Parameters returned from the mouse driver are accessed using CGRES1 -4.
  157.   ■  For more information refer to documentation covering interrupt 33h.
  158.  
  159. ┌─────────────────────────────────────────────────────────────────────────────┐
  160. │ log=CMSEEMU(HSens,VSens)                  {Mouse Driver Keyboard Emulation} │
  161. └─────────────────────────────────────────────────────────────────────────────┘
  162.   ■  Allows mouse to emulate keyboard cursor motion.
  163.   ■  Returns a logical false if mouse driver is not present.
  164.   ■  "HSens" and "VSens" allow setting mickey ratio sensitivity.  Higher
  165.      numbers produce lower sensitivity.  The default is HSens=7, VSens=5.
  166.   ■  Care must be taken to call CMOUSE(0) before the program exits in order to
  167.      prevent the mouse driver from calling the background mouse event handler
  168.      established by this routine, which may no longer be resident in memory.
  169.  
  170. ┌─────────────────────────────────────────────────────────────────────────────┐
  171. │ int=CGRES1() - intCGRES4()                     {Retrieve Function Response} │
  172. └─────────────────────────────────────────────────────────────────────────────┘
  173.   ■  CGRES1() through CGRES4() retrieve parameters passed back from functions
  174.      such as the mouse driver call, CMOUSE.
  175.   ■  CGRES1() retrieves the value passed back in the AX register.
  176.   ■  CGRES2() retrieves the value passed back in the BX register.
  177.   ■  CGRES3() retrieves the value passed back in the CX register.
  178.   ■  CGRES4() retrieves the value passed back in the DX register.
  179.  
  180. ┌─────────────────────────────────────────────────────────────────────────────┐
  181. │ str=CGCDIR([Drive])                            {Get Current Directory Text} │
  182. └─────────────────────────────────────────────────────────────────────────────┘
  183.   ■  Returns the text of the default drive and its current directory.
  184.   ■  If "Drive" is specified (as a text parameter), then the current directory
  185.      of the specified drive is returned.
  186.  
  187. ┌─────────────────────────────────────────────────────────────────────────────┐
  188. │ str=CGVDRVS()                                            {Get Valid Drives} │
  189. └─────────────────────────────────────────────────────────────────────────────┘
  190.   ■  Returns a text string of the drive letters for valid drive references.
  191.   ■  For example, if A:, B:, C:, and F: are all valid drives "ABCF" will be
  192.      returned.
  193.  
  194. ┌─────────────────────────────────────────────────────────────────────────────┐
  195. │ void=CSETCSR(Start,End)                                  {Set Cursor Shape} │
  196. └─────────────────────────────────────────────────────────────────────────────┘
  197.   ■  Sets the cursor shape.
  198.   ■  Normal underline cursor start and end is 6,7.
  199.   ■  Normal block cursor start and end is 0,7.
  200.  
  201. ┌─────────────────────────────────────────────────────────────────────────────┐
  202. │ log=MKDIR(Path)                                            {Make Directory} │
  203. └─────────────────────────────────────────────────────────────────────────────┘
  204.   ■  Makes a Directory.
  205.   ■  Returns a logical false if function failed.
  206.  
  207. ┌─────────────────────────────────────────────────────────────────────────────┐
  208. │ log=RMDIR(Path)                                          {Remove Directory} │
  209. └─────────────────────────────────────────────────────────────────────────────┘
  210.   ■  Removes a Directory.
  211.   ■  Returns a logical false if function failed.
  212.  
  213. ┌─────────────────────────────────────────────────────────────────────────────┐
  214. │ void=SETPAL(List)                                       {Set Color Palette} │
  215. └─────────────────────────────────────────────────────────────────────────────┘
  216.   ■  Sets (remaps) EGA/VGA Color Palette by directly calling:
  217.      Int 10H, Function 10h, Subfunction 2h.
  218.   ■  This procedure is called with a string list of 17 bytes.  The first 16
  219.      bytes directly correspond to the color numbers being remapped.  The last
  220.      byte is used to control the border palette.
  221.   ■  The default palette (normal mapping) is the following string:
  222.         0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63,0
  223.   ■  Bytes within the string must be built using the Clipper CHR() function.
  224.      For example: palette=chr(0)+chr(1)+chr(2)...chr(63)+chr(0)
  225.                   setpal(palette)
  226.  
  227. ┌─────────────────────────────────────────────────────────────────────────────┐
  228. │ str=CHEX(Value)                                     {Convert to Hex String} │
  229. └─────────────────────────────────────────────────────────────────────────────┘
  230.   ■  Converts the value passed to an 8-byte hex string.
  231.  
  232. ┌─────────────────────────────────────────────────────────────────────────────┐
  233. │ int*2=FTEMP(Path)                                   {Create Temporary File} │
  234. └─────────────────────────────────────────────────────────────────────────────┘
  235.   ■  Creates a temporary file in the path specified.
  236.   ■  Returns the handle of the created file, or -1 if unsuccessful.
  237.  
  238. ┌─────────────────────────────────────────────────────────────────────────────┐
  239. │ int=NFILCHK(Filespec)                           {Network File Access Check} │
  240. └─────────────────────────────────────────────────────────────────────────────┘
  241.   ■  Returns an integer result describing a users access rights to a file.
  242.   ■  "Filespec" is the [path]filename to test privaleges on.
  243.   ■  The values returned are:
  244.  
  245.         0 = Full Access
  246.         1 = File Not Found
  247.         2 = Read Access Denied
  248.         3 = Write Access Denied
  249.  
  250. ┌─────────────────────────────────────────────────────────────────────────────┐
  251. │ str=NUSRID()                                           {Get User ID Number} │
  252. └─────────────────────────────────────────────────────────────────────────────┘
  253.   ■  Returns the ID number of a user logged in to a Novell network.
  254.   ■  The ID number is returned as a string of hex digits with leading
  255.      zeros removed.  The maximum length of a user ID string is 8 characters.
  256.   ■  If the workstation is not currently logged in or if the Novell shell
  257.      drivers are not resident, a null string is returned.
  258.  
  259. ┌─────────────────────────────────────────────────────────────────────────────┐
  260. │ str=NUSRNAM()                                               {Get User Name} │
  261. └─────────────────────────────────────────────────────────────────────────────┘
  262.   ■  Returns the login name of a user logged in to a Novell network.
  263.   ■  If the workstation is not currently logged in or if the Novell shell
  264.      drivers are not resident, a null string is returned.
  265.  
  266. ┌─────────────────────────────────────────────────────────────────────────────┐
  267. │ log=NSNDMSG(Name,Text)                                  {Broadcast Message} │
  268. └─────────────────────────────────────────────────────────────────────────────┘
  269.   ■  Sends a message to the specified user on their 25th line of the screen.
  270.   ■  A logical false is returned if the user is not logged in, the user does
  271.      not exist, or the sender is not logged in.
  272.   ■  "Name" is the login name of the user to receive the message.
  273.   ■  "Text" is the message to send (up to 55 characters).
  274.  
  275. ┌─────────────────────────────────────────────────────────────────────────────┐
  276. │ int=NGOCCNT(ObjName,ObjType)                  {Get Object Connection Count} │
  277. └─────────────────────────────────────────────────────────────────────────────┘
  278.   ■  Returns a count of how many times a specific object is logged in to the
  279.      default file server.
  280.   ■  "ObjName" is the name of the object to check.
  281.   ■  "ObjType" is the object type number of the object being searched for.
  282.      A user has a type number of 1.  For more object type numbers refer
  283.      to the list given under NGOLIST.
  284.  
  285. ┌─────────────────────────────────────────────────────────────────────────────┐
  286. │ str=NSVRNAM()                                {Get Default File Server Name} │
  287. └─────────────────────────────────────────────────────────────────────────────┘
  288.   ■  Returns the name of the current default file server.
  289.   ■  A workstation need not be logged in to use this call.
  290.   ■  The maximum length of a file server's name is 47 characters plus the
  291.      end of text character.
  292.  
  293. ┌─────────────────────────────────────────────────────────────────────────────┐
  294. │ log=NATTACH(Server)                                 {Attach To File Server} │
  295. └─────────────────────────────────────────────────────────────────────────────┘
  296.   ■  Installs a server in a workstation shell's server connection table.
  297.   ■  Before objects can log in to a file server, they must first be attached
  298.      in the workstation's server connection table.
  299.   ■  This function returns a logical true if the server specified was already
  300.      attached or is successfully attached.  A logical false is returned if
  301.      the server name specified is not a valid, or the workstation's connection
  302.      table is full (limited to 8 simultaneous server attachments).
  303.   ■  To ensure that a subsequent login attempt is directed to the proper file
  304.      server, follow this call with a call to NPRISVR, to establish the primary
  305.      file server.
  306.  
  307. ┌─────────────────────────────────────────────────────────────────────────────┐
  308. │ log=NDETACH(Server)                               {Detach From File Server} │
  309. └─────────────────────────────────────────────────────────────────────────────┘
  310.   ■  Detaches a file server, erasing it from the server connection table.
  311.      Any further attempts to communicate with the detached server must first
  312.      be preceded by a call to NATTACH to attach it.
  313.   ■  Returns false if the server specified is not found in the file server
  314.      connection table.
  315.   ■  If an object was logged in to the server being detached, it will be
  316.      automatically logged out.
  317.   ■  This procedure will not erase a server from the connection list if it is
  318.      the only server in the connection list.  It will however, still logout
  319.      any objects logged in to that server.
  320.  
  321. ┌─────────────────────────────────────────────────────────────────────────────┐
  322. │ log=NPRISVR([Server])                           {Set Primary Connection ID} │
  323. └─────────────────────────────────────────────────────────────────────────────┘
  324.   ■  Sets the server name specified as the "Primary Connection ID".
  325.   ■  If this function is called with no parameters, the primary
  326.      connection ID is reset to no primary connection.
  327.   ■  A logical false is returned if the server specified is not currently
  328.      attached in the workstation's file server connection table.
  329.   ■  Normally the first server logged in to is set as the primary connection
  330.      number, even if subsequent servers are attached and logged in to as well.
  331.   ■  Before logging in to the first file server, ensure it is attached by
  332.      first calling NATTACH, and then set it as the primary connection by using
  333.      this procedure.  Subsequent attachments and logins should then be done
  334.      by using NATTACH, then temporarily set the "preferred" connection to the
  335.      subsequent server's name, use NLOGIN to log in to the subsequent server,
  336.      and then use NPRESVR() to release the preferred connection.
  337.   ■  To temporarily communicate with a secondarily logged in server, use
  338.      NPRESVR(server) to temporarily switch communications with the server and
  339.      then use NPRESVR() to release the preferred connection so that the primary
  340.      connection connection is active again.
  341.   ■  Note that disk drive references are immune to which server is currently
  342.      preferred or which server is primary.  Their appropriate server is
  343.      arbitrarily resolved by the work station's shell automatically.
  344.  
  345. ┌─────────────────────────────────────────────────────────────────────────────┐
  346. │ log=NPRESVR([Server])                         {Set Preferred Connection ID} │
  347. └─────────────────────────────────────────────────────────────────────────────┘
  348.   ■  Sets the server name specified as the "Preferred Connection ID".
  349.   ■  If this function is called with no parameters, the Preferred
  350.      Connection ID is reset to no preferred connection.
  351.   ■  The preferred connection is used to temporarily override the
  352.      "Primary Connection Id" when using ambiguous file server requests.
  353.      Preferred connections are automatically reset when a application
  354.      program terminates.
  355.   ■  A logical false is returned if the server specified is not currently
  356.      attached in the workstation's file server connection table.
  357.   ■  Normally the first server logged in to is set as the primary connection
  358.      number, even if subsequent servers are attached and logged in to as well.
  359.      Subsequent attachments and logins should be done by using NATTACH, then
  360.      temporarily set the "preferred" connection to the subsequent server's
  361.      name, use NLOGIN to log in to the subsequent server, and then use
  362.      NPRESVR() to release the preferred connection.
  363.   ■  To temporarily communicate with a secondarily logged in server, use
  364.      NPRESVR(server) to temporarily switch communications with the server
  365.      and then use NPRESVR() to release the preferred connection so that the
  366.      primary connection connection is active again.
  367.   ■  Note that disk drive references are immune to which server is currently
  368.      preferred or which server is primary.  Their appropriate server is
  369.      resolved automatically by the work station's shell.
  370.  
  371. ┌─────────────────────────────────────────────────────────────────────────────┐
  372. │ log=NLOGIN(Name,Password,ObjType)            {Login to Default File Server} │
  373. └─────────────────────────────────────────────────────────────────────────────┘
  374.   ■  Logs an object in to the default file server.  To ensure the file
  375.      server desired is attached and is the current primary connection,
  376.      preceed this function with calls to NATTACH, and NPRISVR.
  377.   ■  "Name" is the object's name being logged in.
  378.   ■  "Password" is the password text for the object being logged in.
  379.   ■  "ObjType" is the object type number of the object being logged in.
  380.      A user has a type number of 1.  For more object type numbers refer
  381.      to the list given above under NGOLIST.
  382.   ■  No action automatically follows this call such as executing a system
  383.      login script or remapping of network drives
  384.   ■  NLOGIN returns a logical true if login is successful.
  385.  
  386. ┌─────────────────────────────────────────────────────────────────────────────┐
  387. │ log=NLOGOUT([Server])                                              {Logout} │
  388. └─────────────────────────────────────────────────────────────────────────────┘
  389.   ■  Logs an object out from the file server specified.
  390.   ■  If this function is called with no parameters, all file servers that
  391.      are logged in to will be logged out of.
  392.   ■  A logical false is returned if the server specified is not currently
  393.      attached in the workstation's file server connection table.
  394.  
  395. ┌─────────────────────────────────────────────────────────────────────────────┐
  396. │ int=NGOLIST(Name,Mask,ObjType,ObjName[],IdText[],IdNumber[])     {Obj List} │
  397. └─────────────────────────────────────────────────────────────────────────────┘
  398.   ■  Returns a list of Novell objects based on the object name, object type,
  399.      and group names passed.
  400.   ■  This function can be used to list all user names, or all group names,
  401.      or all users belonging to a group.
  402.   ■  The array names specified as "objname", "idname", and "objid" must
  403.      have been properly dimensioned and filled before calling NGOLIST.
  404.   ■  "Name" is the object name mask to search for.  Wildcard characters are
  405.      legal in the context used under Dos (i.e. "?" and "*").
  406.   ■  "Mask" is a secondary mask to be applied to the search.  The "Mask" is
  407.      only active if the "ObjType" being searched is Users (1), or Groups(2).
  408.      When the object "Name" being searched is for users, the "Mask" field is
  409.      used to reduce the search to groups matching the "Mask".  If the object
  410.      "Name" being searched is for groups, the "Mask" field is used to reduce
  411.      the search to users matching the "Mask".  Wildcard characters are legal
  412.      in the context used under Dos (i.e. "?" and "*").
  413.   ■  "ObjType" is the object type being searched.  Object types are integer
  414.      values as defined by Novell.  User's have an object type of 1.  User
  415.      groups have an object type of 2, and so on....  If the object type is
  416.      not Users (1), or Groups (2), the "Mask" field described above is ignored
  417.      but must be accounted for when delmiting parameters.
  418.   ■  "ObjName[]" is an array filled in by the search which contains the object
  419.      names found.  In the case of users, an object name is the login name.
  420.      In the case of user groups, the object name is the group's name.
  421.      The maximum length of this text is 47 characters plus the End of Text
  422.      character.
  423.   ■  "IdText[]" is an array filled in by the search which contains the
  424.      identification property of the objects found.  This text is normally
  425.      the object's full name.  The maximum length of this text is 127 characters
  426.      plus the End of Text character.
  427.   ■  "IdNumber[]" is an array filled in by the search which contains the object
  428.      numbers found.  In the case of a search for users, the object number is
  429.      the user's ID number.  Object numbers are returned as a string of hex
  430.      digits with the leading zeros removed.  The maximum length of a object
  431.      number is 8 characters plus the End of Text character.
  432.   ■  If an AFILL instruction does not directly preceed each call to NGOLIST,
  433.      care must be taken to ensure that none of the character array elements
  434.      are TRIMMED between calls.  NGOLIST cannot expand the memory (variables)
  435.      passed to it.  If the current length of an array element is insufficient
  436.      to hold the new text, NGOLIST will truncate its output to that available.
  437.  
  438.      Example Program:
  439.  
  440.         clear
  441.         public  ObjName[100], IdText[100], IdNumber[100]
  442.         afill   (ObjName,space(20))
  443.         afill   (IdText,space(47))
  444.         afill   (IdNumber,space(8))
  445.  
  446.         count=NGOLIST("*", "*", 1, ObjName, IdText, IdNumber)
  447.         ? "List of All Users "
  448.         for i = 1 to count
  449.          ? ObjName[i]+IdText[i]+IdNumber[i]
  450.         next i
  451.  
  452.         count=NGOLIST("John*", "*", 1, ObjName, IdText, IdNumber)
  453.         ? "List of All Users With a Login Name of John something"
  454.         for i = 1 to count
  455.          ? ObjName[i]+IdText[i]+IdNumber[i]
  456.         next i
  457.  
  458.         count=NGOLIST("*", "MIS", 1, ObjName, IdText, IdNumber)
  459.         ? "List of All Users Belonging to Group MIS"
  460.         for i = 1 to count
  461.          ? ObjName[i]+IdText[i]+IdNumber[i]
  462.         next i
  463.  
  464.         count=NGOLIST("*", "MIS*", 1, ObjName, IdText, IdNumber)
  465.         ? "List of All Users Belonging to Group MIS_READ or MIS_WRITE"
  466.         for i = 1 to count
  467.          ? ObjName[i]+IdText[i]+IdNumber[i]
  468.         next i
  469.  
  470.         count=NGOLIST("*", "*", 2, ObjName, IdText, IdNumber)
  471.         ? "List of All User Groups "
  472.         for i = 1 to count
  473.          ? ObjName[i]+IdText[i]+IdNumber[i]
  474.         next i
  475.  
  476.         count=NGOLIST("*", "John", 2, ObjName, IdText, IdNumber)
  477.         ? "List of All User Groups Which John Belongs To"
  478.         for i = 1 to count
  479.          ? ObjName[i]+IdText[i]+IdNumber[i]
  480.         next i
  481.  
  482.      This procedure is normally useful for returning the names of logged in
  483.      users, or users that belong to a certain group(s).  However, by changing
  484.      the object type to other Novell defined objects, you can return a list
  485.      of just about anything (i.e., print queues, print servers, gateways,
  486.      bridge servers, etc...).  The following is a list of Object Types as
  487.      currently defined in Netware 286 Version 2.15c:
  488.  
  489.         Name                         Type
  490.         ───────────────────────────  ────
  491.         User.......................     1
  492.         User Group.................     2
  493.         Print Queue................     3
  494.         File Server................     4
  495.         Job Server.................     5
  496.         Gateway....................     6
  497.         Print Server...............     7
  498.         Archive Queue..............     8
  499.         Archive Server.............     9
  500.         Job Queue..................    10
  501.         Administration.............    11
  502.         Remote Bridge Server.......    38
  503.         Advertising Print Server...    71
  504.  
  505. ┌─────────────────────────────────────────────────────────────────────────────┐
  506. │ log=NQATTCH(QueueID)                         {Attach Queue Server to Queue} │
  507. └─────────────────────────────────────────────────────────────────────────────┘
  508.   ■  Allows a job (print) server to attach itself to the specified queue.
  509.   ■  The currently logged in object should have logged in with an object
  510.      type equivalent to the queue involved (i.e. Object Type 7 = Print Server,
  511.      Object Type 5 = Job Server, etc...)
  512.   ■  "QueueID" is a string containing the hex object ID Number of the queue
  513.      to attach to.  The string need not be padded with leading zeros.
  514.   ■  The currently logged in object must have been configured in the desired
  515.      queue as a valid job (or print) server.
  516.   ■  A logical false is returned if the queue does not exist, no login exists,
  517.      or the object logged in is not a valid server for the queue.
  518.  
  519. ┌─────────────────────────────────────────────────────────────────────────────┐
  520. │ log=NQDETCH(QueueID)                       {Detach Queue Server From Queue} │
  521. └─────────────────────────────────────────────────────────────────────────────┘
  522.   ■  Allows a job (print) server to detach itself from the specified queue.
  523.   ■  "QueueID" is a string containing the hex object ID Number of the queue
  524.      to detach from.  The string need not be padded with leading zeros.
  525.   ■  The currently logged in object must have been configured in the desired
  526.      queue as a valid job (or print) server, and have attached itself to the
  527.      queue.
  528.   ■  A logical false is returned if the queue does not exist, no login exists,
  529.      or the object logged in is not a valid server for the queue.
  530.  
  531. ┌─────────────────────────────────────────────────────────────────────────────┐
  532. │ int=NSVQJOB(QueueID,[JobType])                 {Service Queue Job and File} │
  533. └─────────────────────────────────────────────────────────────────────────────┘
  534.   ■  Allows a job (print) server to begin servicing a job in specified queue.
  535.   ■  "QueueID" is a string containing the hex object ID Number of the queue
  536.      to service from.  The string need not be padded with leading zeros.
  537.   ■  "JobType" is an option parameter specifying the type number of only the
  538.      jobs which will be accepted.  If the JobType is not specified, any jobs
  539.      available for service will be accepted.
  540.   ■  The currently logged in object must have been configured in the desired
  541.      queue as a valid job (or print) server, and have attached itself to the
  542.      queue.
  543.   ■  If a queue job is ready and the server is properly attached, a job number
  544.      is returned and the job server can then open and read/write the job file
  545.      using the network device name NETQ.
  546.  
  547. ┌─────────────────────────────────────────────────────────────────────────────┐
  548. │ log=NFSQJOB(QueueID,JobNumber)        {Finish Servicing Queue Job and File} │
  549. └─────────────────────────────────────────────────────────────────────────────┘
  550.   ■  Allows a job (print) server to signal the file server that it has
  551.      completed servicing a job.
  552.   ■  "QueueID" is a string containing the hex object ID Number of the queue
  553.      to service from.  The string need not be padded with leading zeros.
  554.   ■  "JobNumber" is the job number returned when the job was accepted by
  555.      using NSVQJOB above.
  556.   ■  This call removes the job entry, closes and deletes the associated job
  557.      file, and (if the job server has changed to the client's directory access
  558.      rights) restores the calling job server's directory access rights to
  559.      their original (login) value.
  560.  
  561. ┌─────────────────────────────────────────────────────────────────────────────┐
  562. │ log=NASQJOB(QueueID,JobNumber)         {Abort Servicing Queue Job and File} │
  563. └─────────────────────────────────────────────────────────────────────────────┘
  564.   ■  Allows a job (print) server to signal the file server that it cannot
  565.      complete servicing a job previously accepted for service.
  566.   ■  "QueueID" is a string containing the hex object ID Number of the queue
  567.      to service from.  The string need not be padded with leading zeros.
  568.   ■  "JobNumber" is the job number returned when the job was accepted by
  569.      using NSVQJOB above.
  570.   ■  This call causes the associated job file to be closed and, if the job
  571.      server has changed to the client's directory access rights, resets the
  572.      calling job server's directory access rights to their original values.
  573.   ■  When a job is aborted, the file server checks the job entry's Service
  574.      Restart flag to determine whether the job can be restarted automatically
  575.      after a job server aborts the job.  If the job entry's Service Restart
  576.      flag is set, the file server clears the job entry's Server Station,
  577.      Server Task, and Server ID Number fields and leaves the entry in its
  578.      current position in the queue.
  579.  
  580. ┌─────────────────────────────────────────────────────────────────────────────┐
  581. │ log=NCRIGTS(QueueID,JobNumber)                    {Change To Client Rights} │
  582. └─────────────────────────────────────────────────────────────────────────────┘
  583.   ■  Allows a job (print) server to assume the login identity of the client
  584.      that placed the job being serviced in the queue.
  585.   ■  A job being serviced may require that the job server access directories
  586.      and files using the access rights of the client that placed the job into
  587.      the queue.
  588.   ■  "QueueID" is a string containing the hex object ID Number of the queue
  589.      to service from.  The string need not be padded with leading zeros.
  590.   ■  "JobNumber" is the job number returned when the job was accepted by
  591.      using NSVQJOB above.
  592.  
  593. ┌─────────────────────────────────────────────────────────────────────────────┐
  594. │ log=NRRIGTS()                                 {Restore Queue Server Rights} │
  595. └─────────────────────────────────────────────────────────────────────────────┘
  596.   ■  Restores a job (print) server's own identity after it has assumed a
  597.      client's login identity.
  598.  
  599. ┌─────────────────────────────────────────────────────────────────────────────┐
  600. │ int=NQJLIST(QueueID)                                   {Get Queue Job List} │
  601. └─────────────────────────────────────────────────────────────────────────────┘
  602.   ■  Allows a job (print) server to retrieve a list of all jobs pending in the
  603.      specified queue.
  604.   ■  "QueueID" is a string containing the hex object ID Number of the queue
  605.      to service from.  The string need not be padded with leading zeros.
  606.   ■  The integer value returned is a count of job numbers found.  To retrieve
  607.      the job numbers found, follow this call with a call to NQGJLNO, described
  608.      below.
  609.  
  610. ┌─────────────────────────────────────────────────────────────────────────────┐
  611. │ int=NQGJLNO(Index)                                {Get Job List Job Number} │
  612. └─────────────────────────────────────────────────────────────────────────────┘
  613.   ■  Returns a integer representing the job number using the index specified.
  614.   ■  The job list is actually updated by calling NQJLIST above.  Calls to
  615.      NQGJLNO access a static buffer holding the job list numbers produced
  616.      by calling NQJLIST.
  617.  
  618. ┌─────────────────────────────────────────────────────────────────────────────┐
  619. │ str=NQGJSTS(QueueID,JobNumber)                       {Get Queue Job Status} │
  620. └─────────────────────────────────────────────────────────────────────────────┘
  621.   ■  Returns a string comprising of the specified job number's status.
  622.   ■  "QueueID" is a string containing the hex object ID Number of the queue
  623.      to service from.  The string need not be padded with leading zeros.
  624.   ■  "JobNumber" is the job number returned when the job was accepted by
  625.      using NSVQJOB above.
  626.   ■  The string is made up of fixed fields defined as follows:
  627.      Offset  0: Object's Name (20 Characters)
  628.      Offset 20: Queue Job Text Description (40 Characters)
  629.      Offset 60: Queue Job Status (6 Characters)
  630.      Offset 66: Queue Job Number (5 Characters)
  631.  
  632. ┌─────────────────────────────────────────────────────────────────────────────┐
  633. │ int*4=NQGFSIZ(QueueID,JobNumber)                  {Get Queue Job File Size} │
  634. └─────────────────────────────────────────────────────────────────────────────┘
  635.   ■  Returns a long integer depicting the secified job number's file size.
  636.   ■  "QueueID" is a string containing the hex object ID Number of the queue
  637.      to service from.  The string need not be padded with leading zeros.
  638.   ■  "JobNumber" is the job number returned when the job was accepted by
  639.      using NSVQJOB above.
  640.  
  641. ┌─────────────────────────────────────────────────────────────────────────────┐
  642. │ str=NDTTIME()                               {Get File Server Date and Time} │
  643. └─────────────────────────────────────────────────────────────────────────────┘
  644.   ■  Returns a string containing fixed fields of the file server's current
  645.      date, time, and day of week.
  646.  
  647. ┌─────────────────────────────────────────────────────────────────────────────┐
  648. │ void=NSBCMDE(mode)                                     {Set Broadcast Mode} │
  649. └─────────────────────────────────────────────────────────────────────────────┘
  650.   ■  Sets the message mode of the requesting workstation.
  651.  
  652.      The following message modes are defined:
  653.  
  654.         00h  Attached servers store both user and server messages intended
  655.              for the workstation.  The shell automatically retrieves and
  656.              displays each message.
  657.         01h  The server stores server messages but discards user messages
  658.              intended for this station.  The shell automatically retrieves
  659.              and displays each console message.
  660.         02h  The server stores server messages but discards user messages
  661.              intended for this station.  The shell ignores the file server's
  662.              notification that a message exists in the message buffer.
  663.              Applications can poll for and retrieve the most recently stored
  664.              message by calling Get Broadcast Message.
  665.         03h  The server stores both user and server messages intended for
  666.              this station.  The shell ignores the file server's notification
  667.              that a message exists in the message buffer.  Applications can
  668.              poll for and retrieve the most recently stored message by calling
  669.              Get Broadcast Message.
  670.  
  671. ┌─────────────────────────────────────────────────────────────────────────────┐
  672. │ str=NGBCMSG()                                       {Get Broadcast Message} │
  673. └─────────────────────────────────────────────────────────────────────────────┘
  674.   ■  Returns current broadcast message from queue or a null string if non
  675.      present.
  676.  
  677. ┌─────────────────────────────────────────────────────────────────────────────┐
  678. │ log=NATTDIR(Object,Type,Rights,Directory)        {Add Trustee to Directory} │
  679. └─────────────────────────────────────────────────────────────────────────────┘
  680.   ■  Adds a trustee to a directory's trustee list.
  681.   ■  "Object" is the name of the user or group.
  682.   ■  "Type" is 1 if object is a user, 2 if object is a group, etc...
  683.   ■  "Rights" is a character string combining the rights to grant:
  684.         "A" - Access Control
  685.         "C" - Create
  686.         "E" - Erase
  687.         "F" - File Scan
  688.         "M" - Modify
  689.         "R" - Read
  690.         "W" - Write
  691.   ■  "Directory" is the path to grant the rights for.
  692.